В продолжении темы про выпуск сертификатов в Крипто-ПРО расскажу про добавление SubjectSignTool к запросу на сертификат (CSR) через командную строку.
Мануал к cryptocp говорит нам использовать -ext /path/to/ext/file
, но вот про то, как создать файл с расширениями, естественно, умалчивает.
Такие, казалось бы, схожие и одновременно разные понятия, которые часто путают. Чтоб не путаться самому, решил записать.
Идентификация (от латинского identifico — отождествлять): присвоение субъектам и объектам идентификатора и / или сравнение идентификатора с перечнем присвоенных идентификаторов. Например, представление человека по имени отчеству - это идентификация.
Аутентификация (от греческого: αυθεντικός ; реальный или подлинный): подтверждение подлинности чего-либо или кого либо. Например, предъявление паспорта - это подтверждение подлинности заявленного имени отчества.
Авторизация является функцией определения прав доступа к ресурсам и управления этим доступом. Авторизация — это не то же самое что идентификация и аутентификация: идентификация — это называние лицом себя системе; аутентификация — это установление соответствия лица названному им идентификатору; а авторизация — предоставление этому лицу возможностей в соответствие с положенными ему правами или проверка наличия прав при попытке выполнить какое-либо действие. Например, авторизацией являются лицензии на осуществление определенной деятельности.
Получая данные из unix консоли, в результате exec()
и других вызовов, не латинские символы обычно экранируются с помощью \x##, где ## - это шестнадцатеричный код символа, но совсем не UTF8.
Например при получении текста сертификата средствами OpenSSL вместо русских будет что-то вроде этого:
C=RU, L=\xD0\x9C\xD0\xBE\xD1\x81\xD0\xBA\xD0\xB2\xD0\xB0,
Для того чтоб перевести это к читаемому виду в в консоли надо сделать:
<ваша команда> | sed 's@+@ @g;s@%@\\x@g' | xargs -0 printf '%b'
А для PHP вот такой код (на всякий случай, перед x стоит 4 обратных слеша):
preg_replace_callback('/\\\\x([0-9A-F]{2})/', function($a){ return pack('H*', $a[1]); }, $your_string);
В результате получаем русский текст:
C=RU, L=Москва,
Про работу JavaScript КриптоПро
Пишу, как говорится, о наболевшем, я от всей души ненавижу создателей браузерного плагина crypto-pro, но об этом в PS, а теперь к делу. В процессе формирования запроса на сертификат (CSR) силами cadesplugin нам нужно добавить в него расширение SubjectSignTool (OID.1.2.643.100.111) со значением в виде строки (UTF8String).
На первый взгляд все кажется не сложно: создать объект X509Enrollment.CObjectId
и инициализировать его значением, создать объект X509Enrollment.CX509Extension
и инициализировать его созданным OID и нужной строкой с правильным EncodingType. Сделать это правда придется два раза, для синхронного и асинхронного режима, но об этом тоже в PS. На практике все не так просто, и приходится погружаться в низкоуровневое кодирование ASN.1.
На злобу дня современная притча:
Человек, летящий на воздушном шаре, обнаружил, что потерялся. Он спустился немного ниже и заметил на земле женщину. Спустившись ещё чуть ниже, он обратился к ней:
— Простите, не могли бы вы помочь? Я договорился с другом встретиться час назад, но не знаю, где сейчас нахожусь.
— Вы находитесь на воздушном шаре в 30 футах от поверхности Земли, между 40 и 41 градусом северной широты и между 59 и 60 градусом западной долготы ответила женщина.
— Вы, должно быть, программист?
— Да, а как вы догадались?
— Вы мне дали абсолютно точный ответ, но я совершено не представляю, что делать с этой информацией, и я всё ещё потерян. Откровенно говоря, вы мне совершенно ничем не помогли.
— А вы, наверное, менеджер?
— Да. А вы как догадались?
— Вы не знаете, где находитесь и куда направляетесь. Поднялись вы туда, благодаря воздуху. Вы дали обещание, которое не представляете, как выполнить, и ожидаете, что люди, которые находятся ниже вас, решат ваши проблемы. И, наконец, сейчас вы в том же самом положении, в котором находились до встречи со мной, но почему-то теперь в этом оказалась виновата я.